#include "prng.h"

/*
 * @brief 构造函数，初始化 KeyedPRNG。
 *
 * 生成一个 64 字节的随机种子，并使用该种子初始化 BLAKE3 哈希器。
 * 随后，时钟初始化为 0。
 */
KeyedPRNG::KeyedPRNG() 
{
    // 生成 64 字节的随机数种子
    std::random_device rd;
    std::seed_seq seedSeq{rd(), rd(), rd(), rd()}; // 使用多个随机设备值作为种子

    rng.seed(seedSeq);
}

KeyedPRNG::~KeyedPRNG() {}

/*
 * @brief 更新时钟，并生成新的伪随机数。
 *
 * 每调用一次该函数，时钟会递增，并生成一个新的伪随机数。
 * 生成的随机数会被存储在 `sum` 中。
 *
 * @param sum 用于存储生成的伪随机数的字节向量。
 */
void KeyedPRNG::Clock(std::vector<unsigned char> &sum)
{
    uint64_t* ptr = reinterpret_cast<uint64_t*>(sum.data());
#pragma omp parallel for
    for(int i = 0; i < sum.size() / 8; i++){
        ptr[i] = rng();
    }
}